package com.zx.task.manager.utils;

import com.zx.common.tools.id.components.IdGeneratorComponent;
import com.zx.common.tools.utils.SpringContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 任务管理ID生成工具类
 * 使用ID生成器组件生成全局唯一的任务编号
 */
@Slf4j
@Component
public class TaskNoUtils {

    private static IdGeneratorComponent idGeneratorComponent;

    /**
     * 获取ID生成器组件实例
     * 延迟初始化，避免在Spring上下文未准备好时就尝试获取Bean
     *
     * @return IdGeneratorComponent实例
     */
    private static IdGeneratorComponent getIdGeneratorComponent() {
        if (idGeneratorComponent == null) {
            idGeneratorComponent = SpringContextUtil.getBean(IdGeneratorComponent.class);
        }
        return idGeneratorComponent;
    }

    /**
     * 生成任务相关ID
     *
     * @return 带有TASK前缀的唯一ID
     */
    public static String generateTaskId() {
        try {
            String taskId = getIdGeneratorComponent().generateId();
            // 如果是纯数字ID（雪花算法），则添加TASK前缀
            if (taskId.matches("\\d+")) {
                taskId = "TASK" + taskId;
            }
            // 如果是UUID，则直接使用，避免ID过长
            log.debug("Generated task ID: {}", taskId);
            return taskId;
        } catch (Exception e) {
            log.error("Failed to generate task ID", e);
            throw new RuntimeException("Failed to generate task ID", e);
        }
    }

    /**
     * 生成任务编号
     * 为避免ID过长，当使用UUID策略时直接使用ID，不添加前缀
     *
     * @return 任务编号
     */
    public static String generateTaskNo() {
        try {
            String taskNo = getIdGeneratorComponent().generateId();
            // 如果是纯数字ID（雪花算法），则添加TASK前缀
            if (taskNo.matches("\\d+")) {
                taskNo = "TASK" + taskNo;
            }
            // 如果是UUID，则直接使用，避免ID过长
            log.debug("Generated task number: {}", taskNo);
            return taskNo;
        } catch (Exception e) {
            log.error("Failed to generate task number", e);
            throw new RuntimeException("Failed to generate task number", e);
        }
    }
}